package com.code.day16DuoXian2;

/**
 * 生产者类 - 实现Runnable接口
 * 负责生产包子并向消费者发送信号
 */
public class Product implements Runnable {
    // 共享的包子铺资源
    private BaoZiPU baoZiPU;

    /**
     * 构造函数
     * @param baoZiPU 共享的包子铺对象
     */
    public Product(BaoZiPU baoZiPU) {
        this.baoZiPU = baoZiPU;
    }

    /**
     * 生产者的运行逻辑
     * 循环生产包子并在适当时机通知消费者
     */
    @Override
    public void run() {
        while (true) {
            // 同步代码块，确保线程安全
            synchronized (baoZiPU) {
                try {
                    // 模拟生产时间间隔
                    Thread.sleep(100L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                // 如果有包子，则等待消费者消费
                if (baoZiPU.isFlag() == true) {
                    try {
                        baoZiPU.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                // 2.生产包子
                baoZiPU.setCount();
                // 3.修改flag状态为true，表示有包子可供消费
                baoZiPU.setFlag(true);
                // 4.唤醒等待的消费者线程
                baoZiPU.notify();
            }
        }
    }
}
